Laravel 關於資料庫連線的設定寫在 config\database.php 中,來一條條看看設定了什麼。
// config\database.php
'default' => env('DB_CONNECTION', 'mysql'),
預設以哪個連線設定進行資料庫連線,對應 .env 檔裡的 DB_CONNECTION 參數,預設連線 mysql 資料庫。
像是執行指令開啟資料庫 CLI 畫面時
php artisan db
沒有指定的話就是開啟預設資料庫。
php artisan db mysql
像這樣是指定開啟 mysql 資料庫連線。
至於如何定義多個不同連線呢,就是寫在 connections 裡面的內容
// config\database.php
'connections' => [
'sqlite' => [
...
],
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
'pgsql' => [
...
],
'sqlsrv' => [
...
],
]
Laravel 預先建立好了多種不同資料庫連線設定的範本,可以看到許多值是從 env 檔讀取的,一般只要設定 env 就夠了不會用到這裡。
以 mysql 為例,在 .env 中找到以下參數
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=test_sail
DB_USERNAME=sail
DB_PASSWORD=password
如果是用 sail 的話會已經填好連線到 Mysql 容器的設定,這樣之後會自動讀取這裡的參數來連線 mysql 資料庫。
Laravel 對資料庫連線是應用了 PDO (PHP Data Objects) 的功能,所以要確保 php 環境設定中有開啟對應資料庫的 PDO 套件功能。
確認 PDO 是否被啟用,首先找到 php 環境設定檔,執行指令
sail php --ini
會出現目前設定檔的存放位址,主要是 Loaded Configuration File 的部分
開啟位址上的 ini 檔案後試著搜尋 pdo_mysql
;php.ini
...
extension=pdo_mysql
;extension=pdo_oci
;extension=pdo_odbc
;extension=pdo_pgsql
;extension=pdo_sqlite
...
可以看到一排被註解的 extesion 設定,可以將需要的套件解除註解,這樣之後執行 php 指令時就會載入該套件了。
如果是用 sail 的話 php.ini 會在容器當中
不過前提是該套件檔在套件資料夾中是存在的,要找套件資料夾,在 php.ini 中搜尋
"extension_dir = ",就可以找到目前設定的套件資料夾在哪裡。
接著到該資料夾裡應該要能看到 pdo 的套件。
除了 connections 內的資料庫外還有一個特別被定義的資料庫連線,redis
'redis' => [
'client' => env('REDIS_CLIENT', 'phpredis'),
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
],
'default' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'),
],
'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
],
],
Redis 是一個開源,基於記憶體的鍵值對資料庫,因為是基於記憶體的構造所以讀寫速度較硬碟式的資料庫快得多,實務上有用來做 Unique Job Queue 讓 Laravel 定時執行任務,但避免執行重複的(正在執行當中)的任務。
關於 Redis 設定比較多,夠寫另一篇了。